/*
 * VarDiversificado.java
 *
 * Created on 7 de mayo de 2006, 07:10 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package ig.util;

import ig.metrica.ejb.html.GenerarHTML;
import ig.util.ejb.IGBean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
//import javax.naming.InitialContext;
//import javax.naming.NamingException;
import javax.sql.DataSource;

/**
 *
 * @author Eliecer Cortes
 */
public class VarDiversificado {


    public VarDiversificado() {
    }

    /**
     *  Gets the connection attribute of the Consultas class
     *
     *@param  cnn       Description of the Parameter
     *@param  usuario   Description of the Parameter
     *@param  password  Description of the Parameter
     *@return           The connection value
     */
    private static Connection getConnection(Connection cnn, String usuario, String password)throws Exception {
        try {
            return  DriverManager.getConnection(cnn.getMetaData().getURL(), usuario, password);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

    public static Double getVarDiversificadoTotalDB(Connection connectionreport, String usuario, String pwd, Integer idmatriz) {
        String consultaSQL = "SELECT SUM(AA.VER) AS VER, AA.FACTORRIESGO, FR.POSICION AS POSICION "
                + "FROM  "
                + "(SELECT VER AS VER, FACTORRIESGO AS FACTORRIESGO  "
                + "FROM METRICADB..VARCONTRATOSTASA VCT INNER JOIN  "
                + "CONTRATOS C ON VCT.IDCONTRATO = C.ID INNER JOIN  "
                + "PRODUCTOS P ON C.IDPRODUCTO = P.ID  "
                + "INNER JOIN  UNIDADESNEGOCIOS U ON C.IDUNIDADNEGOCIO = U.ID  "
                + "WHERE U.IDEMPRESA = 1 "
                + "UNION ALL  "
                + "SELECT VER AS VER, FACTORRIESGO AS FACTORRIESGO  "
                + "FROM METRICADB..VARCONTRATOSPRECIO VCP INNER JOIN  "
                + "CONTRATOS C ON VCP.IDCONTRATO = C.ID INNER JOIN  "
                + "PRODUCTOS P ON C.IDPRODUCTO = P.ID  "
                + "INNER JOIN  UNIDADESNEGOCIOS U ON C.IDUNIDADNEGOCIO = U.ID  "
                + "WHERE U.IDEMPRESA = 1)  "
                + "AS AA  "
                + "INNER JOIN METRICADW..FACTORESRIESGO FR ON AA.FACTORRIESGO = FR.NOMBRE  "
                + "GROUP BY AA.FACTORRIESGO, FR.POSICION   "
                + "UNION  "
                + "SELECT SUM(C.SALDOCONTABLE*CEM.CAMBIOESPERADO) AS VER,A.FACTORRIESGO,A.POSICION  "
                + "FROM POSICIONESESPECIES PE INNER JOIN  "
                + "CONTRATOS C ON C.ID=PE.ID INNER JOIN "
                + "UNIDADESNEGOCIOS U ON U.ID=C.IDUNIDADNEGOCIO INNER JOIN "
                + "ESPECIES E ON PE.IDESPECIE=E.ID INNER JOIN  "
                + "(SELECT IDCONTRATO FROM VARCONTRATOSTASA "
                + "UNION "
                + "SELECT IDCONTRATO FROM VARCONTRATOSPRECIO) VCT "
                + "ON PE.ID=VCT.IDCONTRATO INNER JOIN "
                + "(SELECT  F.POSICION AS POSICION, M.ID AS IDMONEDA,F.NOMBRE AS FACTORRIESGO "
                + "FROM METRICADW..ASOCIACIONFACTORES A INNER JOIN "
                + " METRICADW..FACTORESRIESGOPERSONALES FR ON A.IDFACTORRIESGOPERSONAL = FR.ID INNER JOIN "
                + " METRICADW..FACTORESRIESGO F ON FR.IDFACTORMATRIZ = F.ID INNER JOIN "
                + " METRICADW..MONEDAS M ON A.ENTIDAD = M.NOMBRE COLLATE Modern_Spanish_CI_AS "
                + "WHERE A.IDMODELO=(SELECT DISTINCT MR.ID FROM METRICADW..MODELOS M  "
                + " INNER JOIN METRICADW..ASOCIACIONFACTORES A ON M.ID=A.IDMODELO  "
                + " INNER JOIN METRICADW..FACTORESRIESGOPERSONALES F ON A.IDFACTORRIESGOPERSONAL=F.ID  "
                + " INNER JOIN METRICADW..FACTORESRIESGO FR ON F.IDFACTORMATRIZ=FR.ID  "
                + " INNER JOIN METRICADW..MATRICESCORRELACION MR ON FR.IDMATRIZ=MR.ID  "
                + " INNER JOIN METRICADW..ESCENARIOS E ON E.IDMODELO = M.ID  "
                + " WHERE ESTADO = 1)) A "
                + "ON E.IDMONEDA=A.IDMONEDA "
                + "AND E.IDMONEDA<>1 "
                + "INNER JOIN CAMBIOESPERADOMONEDAS CEM "
                + "ON CEM.IDMONEDA=E.IDMONEDA "
                + "INNER JOIN VALORESMONEDAS VM  "
                + "ON VM.IDMONEDA=E.IDMONEDA AND VM.FECHA= "
                + "(SELECT DISTINCT FECHA FROM METRICADW..ESCENARIOS  WHERE ESTADO = 1) "
                + "GROUP BY FACTORRIESGO,POSICION "
                + "ORDER BY POSICION ";


        consultaSQL = parserQuery(consultaSQL, null);
        double varDiversificado = VarDiversificado.getVarDiversificadoConsultaSql(connectionreport, usuario, pwd, consultaSQL, idmatriz);

        return Double.valueOf(varDiversificado);
    }

    /**
     *  Gets the var diversificado para LA MONEDA, EMPRESA O PORTAFOLIO INDICADO de las tablas VarContratosTasa y Varcontratosprecio
     *  de la BD METRICADB
     *  Consultas class
     *
     *@param  connectionreport  objeto conexion del reporte
     *@param  usuario           usuario
     *@param  pwd               password de la bdatos
     *@param  variableFiltro    Codigo del filtro:   1 para empresas, 2 para monedas, 3 para portafolios
     *@param  idVariableFiltro  Id de la entidad por la que se quiere filtrar
     *@return                   The var diversificado del portafolio
     *      v
     */
    public static Double getVarDiversificadoParcialDB(Connection connectionreport, String usuario, String pwd, int variableFiltro, Long idVariableFiltro, Integer idmatriz) {
        String consultaSQL = " ";
        switch (variableFiltro) {
            case 1:
                consultaSQL =
                        "SELECT VER, FACTORRIESGO, POSICION " +
                        "FROM V_VAR_PARCIAL_CASE_1 " +
                        "WHERE IDEMPRESA = " + idVariableFiltro + " " +
                        "AND IDMATRIZ = " + idmatriz  + " " +
                        "ORDER BY POSICION " ;
                break;
            case 2:
                consultaSQL =
                        "SELECT VER, FACTORRIESGO, POSICION " +
                        "FROM V_VAR_PARCIAL_CASE_2 " +
                        "WHERE IDMONEDA = " + idVariableFiltro + " " +
                        "ORDER BY POSICION " ;
               break;
            case 3:
                consultaSQL =
                        "SELECT VER, FACTORRIESGO, POSICION " +
                        "FROM V_VAR_PARCIAL_CASE_3 " +
                        "WHERE IDUNIDAD = " + idVariableFiltro + " " +
                        "ORDER BY POSICION " ;
                break;
            case 4:
                consultaSQL =
                        "SELECT VER,FACTORRIESGO,POSICION " +
                        "FROM V_VAR_PARCIAL_CASE_4 " +
                        "WHERE IDEMPRESA = " + idVariableFiltro + " " +
                        "ORDER BY POSICION ";
                break;
        }

        consultaSQL = parserQuery(consultaSQL, null);
        double varDiversificado = VarDiversificado.getVarDiversificadoConsultaSql(connectionreport, usuario, pwd, consultaSQL, idmatriz);
        return Double.valueOf(varDiversificado);

    }

    public static Double getVarDiversificadoEmpresaPortafolioEspecieDB(Connection connectionreport, String usuario, String pwd, int idEmpresa, int idPortafolio, int idEspecie, Integer idmatriz) {

        String consultaSQL = "SELECT SUM(AA.VER) AS VER, AA.FACTORRIESGO, FR.POSICION AS POSICION "
                + "FROM "
                + "(SELECT VER AS VER, FACTORRIESGO AS FACTORRIESGO,IDCONTRATO "
                + "FROM METRICADB..VARCONTRATOSTASA VCT INNER JOIN "
                + "CONTRATOS C ON VCT.IDCONTRATO = C.ID INNER JOIN "
                + "PRODUCTOS P ON C.IDPRODUCTO = P.ID "
                + "INNER JOIN  UNIDADESNEGOCIOS U ON C.IDUNIDADNEGOCIO = U.ID "
                + "INNER JOIN POSICIONESESPECIES PE ON VCT.IDCONTRATO= PE.ID "
                + "WHERE U.IDEMPRESA = " + idEmpresa + " AND C.IDUNIDADNEGOCIO= " + idPortafolio + " AND PE.IDESPECIE= " + idEspecie
                + "UNION ALL "
                + "SELECT VER AS VER, FACTORRIESGO AS FACTORRIESGO , IDCONTRATO "
                + "FROM METRICADB..VARCONTRATOSPRECIO VCP INNER JOIN "
                + "CONTRATOS C ON VCP.IDCONTRATO = C.ID INNER JOIN "
                + "PRODUCTOS P ON C.IDPRODUCTO = P.ID "
                + "INNER JOIN  UNIDADESNEGOCIOS U ON C.IDUNIDADNEGOCIO = U.ID "
                + "INNER JOIN POSICIONESESPECIES PE ON VCP.IDCONTRATO= PE.ID "
                + "WHERE U.IDEMPRESA = " + idEmpresa + " AND C.IDUNIDADNEGOCIO= " + idPortafolio + " AND PE.IDESPECIE= " + idEspecie + ")"
                + "AS AA "
                + "INNER JOIN METRICADW..FACTORESRIESGO FR ON AA.FACTORRIESGO = FR.NOMBRE "
                + "GROUP BY AA.FACTORRIESGO, FR.POSICION "
                + "UNION  "
                + "SELECT SUM(C.SALDOCONTABLE*CEM.CAMBIOESPERADO) AS VER,A.FACTORRIESGO,A.POSICION  "
                + "FROM POSICIONESESPECIES PE INNER JOIN  "
                + "CONTRATOS C ON C.ID=PE.ID INNER JOIN "
                + "UNIDADESNEGOCIOS U ON U.ID=C.IDUNIDADNEGOCIO AND U.IDEMPRESA = " + idEmpresa + " AND C.IDUNIDADNEGOCIO= " + idPortafolio
                + "INNER JOIN "
                + "ESPECIES E ON PE.IDESPECIE=E.ID AND E.ID=" + idEspecie
                + "INNER JOIN  "
                + "(SELECT IDCONTRATO FROM VARCONTRATOSTASA "
                + "UNION "
                + "SELECT IDCONTRATO FROM VARCONTRATOSPRECIO) VCT "
                + "ON PE.ID=VCT.IDCONTRATO INNER JOIN "
                + "(SELECT  F.POSICION AS POSICION, M.ID AS IDMONEDA,F.NOMBRE AS FACTORRIESGO "
                + "FROM METRICADW..ASOCIACIONFACTORES A INNER JOIN "
                + " METRICADW..FACTORESRIESGOPERSONALES FR ON A.IDFACTORRIESGOPERSONAL = FR.ID INNER JOIN "
                + " METRICADW..FACTORESRIESGO F ON FR.IDFACTORMATRIZ = F.ID INNER JOIN "
                + " METRICADW..MONEDAS M ON A.ENTIDAD = M.NOMBRE COLLATE Modern_Spanish_CI_AS "
                + "WHERE A.IDMODELO=(SELECT DISTINCT MR.ID FROM METRICADW..MODELOS M  "
                + " INNER JOIN METRICADW..ASOCIACIONFACTORES A ON M.ID=A.IDMODELO  "
                + " INNER JOIN METRICADW..FACTORESRIESGOPERSONALES F ON A.IDFACTORRIESGOPERSONAL=F.ID  "
                + " INNER JOIN METRICADW..FACTORESRIESGO FR ON F.IDFACTORMATRIZ=FR.ID  "
                + " INNER JOIN METRICADW..MATRICESCORRELACION MR ON FR.IDMATRIZ=MR.ID  "
                + " INNER JOIN METRICADW..ESCENARIOS E ON E.IDMODELO = M.ID  "
                + " WHERE ESTADO = 1)) A "
                + "ON E.IDMONEDA=A.IDMONEDA "
                + "AND E.IDMONEDA<>1 "
                + "INNER JOIN CAMBIOESPERADOMONEDAS CEM "
                + "ON CEM.IDMONEDA=E.IDMONEDA "
                + "INNER JOIN VALORESMONEDAS VM  "
                + "ON VM.IDMONEDA=E.IDMONEDA AND VM.FECHA= "
                + "(SELECT DISTINCT FECHA FROM METRICADW..ESCENARIOS  WHERE ESTADO = 1) "
                + "GROUP BY FACTORRIESGO,POSICION "
                + "ORDER BY POSICION ";

        consultaSQL = parserQuery(consultaSQL, null);
        double varDiversificado = VarDiversificado.getVarDiversificadoConsultaSql(connectionreport, usuario, pwd, consultaSQL, idmatriz);
        return Double.valueOf(varDiversificado);

    }

    private static String parserQuery(String query, Connection connection) {
        String Mdw = "METRICADW";
        String Mdb = "METRICADB";
        String DATA_BASE = "";

        try {
            if (connection == null) {
                Connection conn =   new IGBean().getNewConexion("METRICADB");//((DataSource) new InitialContext().lookup("java:/METRICADB")).getConnection();
                Mdb = conn.getCatalog();
                DATA_BASE = conn.getMetaData().getDatabaseProductName().trim();
                if (Mdb == null && conn.getMetaData().getDatabaseProductName().trim().equals("Oracle")) {
                    Mdb = conn.getMetaData().getUserName();
                }
                
                Connection conn1 = new IGBean().getNewConexion("METRICADW");//((DataSource) new InitialContext().lookup("java:/METRICADW")).getConnection();
                Mdw = conn1.getCatalog();
                if (Mdw == null && conn1.getMetaData().getDatabaseProductName().trim().equals("Oracle")) {
                    Mdw = conn1.getMetaData().getUserName();
                }
                conn1.close();
            } else {
                DATA_BASE = connection.getMetaData().getDatabaseProductName().trim();
                String user = connection.getCatalog();
                if (user == null && DATA_BASE.trim().equals("Oracle")) {
                    user = connection.getMetaData().getUserName();
                }

                if (user.equalsIgnoreCase("METRICADW")) {
                    Mdw = connection.getCatalog();
                    if (Mdw == null && DATA_BASE.trim().equals("Oracle")) {
                        Mdw = connection.getMetaData().getUserName();
                    }
                } else if (user.equalsIgnoreCase("METRICADB")) {
                    Mdb = connection.getCatalog();
                    if (Mdb == null && DATA_BASE.trim().equals("Oracle")) {
                        Mdb = connection.getMetaData().getUserName();
                    }
                }
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        //} catch (NamingException ex) {
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        query = query.toUpperCase();
        //se hace el cambio de los nombres quemados de metricadb y metricadw

        String VACIO = "";
        if (DATA_BASE.equals("Oracle")) {
            VACIO = ".";
            query = query.replace("ISNULL", "NVL");
            query = query.replace(" LTRIM(RTRIM(", " TRIM((");
        }
        query = query.replace("METRICADB" + VACIO, Mdb);
        query = query.replace("METRICADW" + VACIO, Mdw);

        return query;
    }

    public static Double getVarDiversificadoConsultaSql(Connection connectionreport, String usuario, String pwd, String consultaSQL, Integer idmatriz) {
        double varDiversificado = 0;
        Integer[] posicionFactor = null;
        Double[] ver = null;
        Integer[] posicionMatriz = null;
        Double[] valorMatriz = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        Connection cnn = null;
        StringBuilder builder = new StringBuilder("");
        String ConsultaSQL2 = null;

        try {
            if (connectionreport != null && !connectionreport.isClosed()) {
                cnn = connectionreport;
            } else {
                cnn = getConnection(connectionreport, usuario, pwd);
            }
            try {
                pstmt.close();
                pstmt=null;
            } catch (Exception e) {
            }
            pstmt = cnn.prepareStatement(consultaSQL);
            rs = pstmt.executeQuery();
            Collection<Object> posicionFactorCollection = new ArrayList<Object>();
            Collection<Double> verCollection = new ArrayList<Double>();
            //Collection<Object> factorCollection = new ArrayList<Object>();

            while (rs.next()) {
                /*
                SELECT VER, FACTORRIESGO, POSICION FROM ? WHERE ?
                */
                Double valorVer = rs.getDouble(1);
                String valorFactor = rs.getString(2);
                Integer valorPos = rs.getInt(3);
                verCollection.add(valorVer);
                posicionFactorCollection.add(valorPos);
                builder.append("Ver: " + valorVer + " Factor: " + valorFactor + " Pos: " + valorPos + "\n");
            }
            posicionFactor = posicionFactorCollection.toArray(new Integer[0]);
            ver = verCollection.toArray(new Double[0]);
            if(posicionFactor.length == 0 && ver.length == 0){
                GenerarHTML.gewInstace().printlnDebug("La consulta no retorna resultados.");
            }
        } catch (Exception e) {
            System.out.println("*****CONSULTA:\n" + consultaSQL + "\n*****");
            e.printStackTrace();
        } finally {
            try {rs.close();} catch (SQLException ex) {}
            try {pstmt.close();} catch (SQLException ex) {}
            if (connectionreport == null && cnn != null) {
                //try {cnn.close();} catch (SQLException ex) {}
            }
        }
        
        try {
            if (connectionreport != null && !connectionreport.isClosed()) {
                cnn = connectionreport;
            } else {
                cnn = getConnection(connectionreport, usuario, pwd);
            }
            if (pstmt != null) {
                pstmt.close();
            }
            ConsultaSQL2 = "SELECT POSICION, VALOR FROM METRICADW..VALORESMATRICES WHERE IDMATRIZ = " + idmatriz + " ORDER BY POSICION  ";
            ConsultaSQL2 = parserQuery(ConsultaSQL2, cnn);            
            pstmt = cnn.prepareStatement(ConsultaSQL2);

            rs = pstmt.executeQuery();
            Collection<Integer> posicionMCCollection = new ArrayList<Integer>();
            Collection<Object> valorMCCollection = new ArrayList<Object>();
            while (rs.next()) {
                Integer posicionMC = rs.getInt("POSICION");
                Double valorMC = rs.getDouble("VALOR");
                posicionMCCollection.add(posicionMC);
                valorMCCollection.add(valorMC);
            }
            posicionMatriz = posicionMCCollection.toArray(new Integer[0]);//256
            valorMatriz = valorMCCollection.toArray(new Double[0]);//256
            pstmt.close();
        } catch (Exception e) {
            System.out.println("ConsultaSQL2 : " + ConsultaSQL2);
            e.printStackTrace();
        } finally {
            try {rs.close();} catch (SQLException ex) {}
            try {pstmt.close();pstmt=null;} catch (SQLException ex) {}
            if (connectionreport == null && cnn != null) {
                //try {cnn.close();} catch (SQLException ex) {}
            }
        }

        try {
            int numVars = posicionFactor.length;//8
            int numPosicionesMatriz = posicionMatriz.length;//256
            int numFactores = (int)Math.round(Math.sqrt(numPosicionesMatriz));//16

            // Calculo de las posiciones de la Matriz de correlacion con solo los factores que tienen Var
            Integer[] posicionFactorMatrizResumida = new Integer[ numVars * numVars];//64
            int contador = 0;
            for (int j = 0; j < numVars; j++) {
                for (int k = 0; k < numVars; k++) {
                    posicionFactorMatrizResumida[contador++] = ((posicionFactor[j] - 1) * numFactores) +  posicionFactor[k];
                    //System.out.println(posicionFactorMatrizResumida[contador-1]);
                }
            }

            if (valorMatriz.length > 0) {
                // Calculo de la Matriz resumida
                Integer numValoresMatrizResumida = posicionFactorMatrizResumida.length;//64
                Double[] valorMatrizResumida = new Double[ numValoresMatrizResumida];

                for (int j = 0; j < (int) numValoresMatrizResumida; j++) {
                    valorMatrizResumida[j] = valorMatriz[posicionFactorMatrizResumida[j].intValue() - 1];
                }

                // Calculo de [VAR]*[Matriz de Correlacion]
                Double[] varPorMatriz = new Double[numVars];
                int i = 0;
                int k = 0;

                while (i < (int) numValoresMatrizResumida) {
                    varPorMatriz[k] = new Double(0);
                    for (int j = 0; j < (int) numVars; j++) {
                        varPorMatriz[k] = varPorMatriz[k] + ( valorMatrizResumida[i] * ver[j]);
                        i++;
                    }
                    k++;
                }

                // Calculo del Var diversificado
                for (int j = 0; j < numVars; j++) {
                    varDiversificado = varDiversificado + (varPorMatriz[j] *  ver[j]);
                }
                if (varDiversificado >= 0) {
                    varDiversificado = Math.sqrt(varDiversificado);
                } else {
                    varDiversificado = -999999;
                }
            } else {
                builder.append("Para la asociada no existen registros en la tabla VALORESMATRICES\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        builder.append("Var Diversificado:" + varDiversificado + "\n");
        GenerarHTML.gewInstace().printlnDebug(builder.toString());
        return Double.valueOf(varDiversificado);
    }

    public static void main(String[] arg)throws Exception{
        
        Class.forName("net.sourceforge.jtds.jdbc.Driver");
        Connection c = DriverManager.getConnection("jdbc:jtds:sqlserver://192.168.0.27:1433/METRICADW", "sa", "");
        Integer $PESCENARIO = 1285;
        Integer $FIDEMPRESA = 2;
        String consulta =
                "SELECT SUM(AA.VER) AS VER, AA.FACTORRIESGO, FR.POSICION AS POSICION "+
                "FROM  "+
                "(SELECT VCT.VER*VRM.VALOR AS VER, FACTORRIESGO AS FACTORRIESGO  "+
                "FROM METRICADW..VARCONTRATOSTASA VCT INNER JOIN  "+
                "METRICADW..CONTRATOS C ON VCT.IDCONTRATO = C.ID INNER JOIN  "+
                "METRICADW..PRODUCTOS P ON C.IDPRODUCTO = P.ID  "+
                "INNER JOIN (SELECT VM.VALOR,VM.IDMONEDA  "+
                "    FROM METRICADW..VALORESMONEDAS VM  "+
                "    INNER JOIN  "+
                "    (SELECT IDMONEDA,max(VSM.fecha) AS FECHAMAX FROM METRICADW..VALORESMONEDAS VSM  "+
                "    INNER JOIN ESCENARIOS E ON E.ID = "+$PESCENARIO+" "+
                "    where VSM.IDESCENARIO = "+$PESCENARIO+"  "+
                "    and VSM.FECHA<  E.FECHA "+
                "    GROUP BY IDMONEDA) MM  "+
                "    ON VM.IDMONEDA = MM.IDMONEDA  "+
                "    AND VM.FECHA = MM.FECHAMAX  "+
                "    WHERE VM.IDESCENARIO = "+$PESCENARIO+" ) VRM  "+
                "ON VRM.IDMONEDA = P.IDMONEDA  "+
                "INNER JOIN METRICADW..UNIDADESNEGOCIOS U ON C.IDUNIDADNEGOCIO = U.ID  "+
                "WHERE U.IDEMPRESA = "+$FIDEMPRESA+" "+
                "AND  VCT.IDESCENARIO = "+$PESCENARIO+" "+
                "AND  C.IDESCENARIO =  "+$PESCENARIO+" "+
                "AND  P.IDESCENARIO =  "+$PESCENARIO+" "+
                "AND  U.IDESCENARIO =  "+$PESCENARIO+" "+
                "UNION ALL  "+
                "SELECT VCP.VER*VRM.VALOR AS VER, FACTORRIESGO AS FACTORRIESGO  "+
                "FROM METRICADW..VARCONTRATOSPRECIO VCP INNER JOIN  "+
                "METRICADW..CONTRATOS C ON VCP.IDCONTRATO = C.ID INNER JOIN  "+
                "METRICADW..PRODUCTOS P ON C.IDPRODUCTO = P.ID  "+
                "INNER JOIN (SELECT VM.VALOR,VM.IDMONEDA  "+
                "    FROM METRICADW..VALORESMONEDAS VM  "+
                "    INNER JOIN  "+
                "    (SELECT IDMONEDA,max(VSM.fecha) AS FECHAMAX FROM METRICADW..VALORESMONEDAS VSM  "+
                "    INNER JOIN ESCENARIOS E ON E.ID = "+$PESCENARIO+" "+
                "    where VSM.IDESCENARIO = "+$PESCENARIO+"  "+
                "    and VSM.FECHA<  E.FECHA "+
                "    GROUP BY IDMONEDA) MM  "+
                "    ON VM.IDMONEDA = MM.IDMONEDA  "+
                "    AND VM.FECHA = MM.FECHAMAX  "+
                "    WHERE VM.IDESCENARIO = "+$PESCENARIO+" ) VRM  "+
                "ON VRM.IDMONEDA = P.IDMONEDA  "+
                "INNER JOIN METRICADW..UNIDADESNEGOCIOS U ON C.IDUNIDADNEGOCIO = U.ID  "+
                "WHERE U.IDEMPRESA =  "+$FIDEMPRESA+" "+
                "AND  VCP.IDESCENARIO =  "+$PESCENARIO+" "+
                "AND  C.IDESCENARIO =  "+$PESCENARIO+" "+
                "AND  P.IDESCENARIO =  "+$PESCENARIO+" "+
                "AND  U.IDESCENARIO = "+$PESCENARIO+") "+
                "AS AA  "+
                "INNER JOIN METRICADW..FACTORESRIESGO FR ON AA.FACTORRIESGO = FR.NOMBRE  "+
                "GROUP BY AA.FACTORRIESGO, FR.POSICION  "+
                "UNION  "+
                "SELECT SUM(PE.VALORNOMINAL*CEM.CAMBIOESPERADO) AS VER,A.FACTORRIESGO,A.POSICION  "+
                "FROM METRICADW..POSICIONESESPECIES PE INNER JOIN  "+
                "METRICADW..CONTRATOS C ON C.ID=PE.ID INNER JOIN  "+
                "METRICADW..UNIDADESNEGOCIOS U ON U.ID=C.IDUNIDADNEGOCIO INNER JOIN  "+
                "METRICADW..ESPECIES E ON PE.IDESPECIE=E.ID INNER JOIN  "+
                "(SELECT F.POSICION AS POSICION, M.ID AS IDMONEDA,F.NOMBRE AS FACTORRIESGO  "+
                "FROM METRICADW..ASOCIACIONFACTORES A INNER JOIN  "+
                "METRICADW..FACTORESRIESGOPERSONALES FR ON A.IDFACTORRIESGOPERSONAL = FR.ID INNER JOIN  "+
                "METRICADW..FACTORESRIESGO F ON FR.IDFACTORMATRIZ = F.ID INNER JOIN  "+
                "METRICADW..MONEDAS M ON A.ENTIDAD = M.NOMBRE COLLATE Modern_Spanish_CI_AS  "+
                "INNER JOIN METRICADW..ESCENARIOS ES ON ES.IDMODELO = A.IDMODELO "+
                "WHERE ES.ID  = "+$PESCENARIO+" AND M.IDESCENARIO = "+$PESCENARIO+") A  "+
                "ON E.IDMONEDA=A.IDMONEDA  "+
                "AND E.IDMONEDA<>1  "+
                "INNER JOIN METRICADW..CAMBIOESPERADOMONEDAS CEM  "+
                "ON CEM.IDMONEDA=E.IDMONEDA  "+
                "INNER JOIN METRICADW..VALORESMONEDAS VM  "+
                "ON VM.IDMONEDA=E.IDMONEDA AND VM.FECHA=  "+
                "(SELECT DISTINCT FECHA FROM METRICADW..ESCENARIOS ESC WHERE ESC.ID = "+$PESCENARIO+")  "+
                "WHERE  U.IDEMPRESA ="+$FIDEMPRESA+" AND PE.IDESCENARIO = "+$PESCENARIO+" "+
                "AND C.IDESCENARIO = "+$PESCENARIO+" "+
                "AND U.IDESCENARIO = "+$PESCENARIO+" "+
                "AND E.IDESCENARIO = "+$PESCENARIO+" "+
                "AND CEM.IDESCENARIO = "+$PESCENARIO+" "+
                " AND VM.IDESCENARIO = "+$PESCENARIO+" "+
                "GROUP BY FACTORRIESGO,POSICION  "+
                "ORDER BY POSICION";

        Double value = getVarDiversificadoConsultaSql(c, null, null, consulta, 1);
        System.out.println("value : "+value);
    }
}
